Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/BaseMetricChart.kt 520fa717a938fd84682403b41f57d9f7e1ef49ef (520fa717) Text, 13.86 KB

T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.node.metrics

Tff7b72import T7ee787androidx.compose.animation.AnimatedVisibility
Tff7b72import T7ee787androidx.compose.animation.expandVertically
Tff7b72import T7ee787androidx.compose.animation.shrinkVertically
Tff7b72import T7ee787androidx.compose.foundation.layout.BoxWithConstraints
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.ColumnScope
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxHeight
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyListState
Tff7b72import T7ee787androidx.compose.foundation.lazy.rememberLazyListState
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberCoroutineScope
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.platform.testTag
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.AutoScrollCondition
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.CartesianChartHost
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.FadingEdges
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.Scroll
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.VicoScrollState
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.Zoom
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.Axis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.HorizontalAxis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.CartesianChartModelProducer
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.decoration.Decoration
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.marker.CartesianMarker
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.marker.CartesianMarkerVisibilityListener
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.rememberCartesianChart
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.rememberFadingEdges
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.rememberVicoScrollState
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.rememberVicoZoomState
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.jetbrains.compose.resources.StringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.model.TelemetryType
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.collapse_chart
Tff7b72import T7ee787org.meshtastic.core.resources.expand_chart
Tff7b72import T7ee787org.meshtastic.core.resources.info
Tff7b72import T7ee787org.meshtastic.core.resources.logs
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.icon.BarChart
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Info
Tff7b72import T7ee787org.meshtastic.core.ui.icon.List
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Refresh

T8b949e/**
* A generic chart host for Meshtastic metric charts. Handles common boilerplate for markers, scrolling, and point
* selection synchronization.
*
* Uses [FadingEdges] to indicate scrollable content beyond the visible area, and accepts optional [Decoration]s for
* reference threshold lines/bands.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffGenericMetricChartTb4b4b4(
Te6edf3modelProducerTb4b4b4: Te6edf3CartesianChartModelProducerTb4b4b4,
Te6edf3layersTb4b4b4: Te6edf3ListTff7b72<Te6edf3LineCartesianLayerTff7b72>Tb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3startAxisTb4b4b4: Te6edf3VerticalAxisTff7b72<Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3StartTff7b72>Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3endAxisTb4b4b4: Te6edf3VerticalAxisTff7b72<Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3EndTff7b72>Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3bottomAxisTb4b4b4: Te6edf3HorizontalAxisTff7b72<Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3HorizontalTb4b4b4.Te6edf3BottomTff7b72>Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3markerTb4b4b4: Te6edf3CartesianMarker? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3decorationsTb4b4b4: Te6edf3ListTff7b72<Te6edf3DecorationTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedXTb4b4b4: Tffa657Double? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onPointSelectedTb4b4b4: Tb4b4b4(Tb4b4b4(Tffa657DoubleTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3vicoScrollStateTb4b4b4: Te6edf3VicoScrollState Tff7b72= Te6edf3rememberVicoScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3markerVisibilityListener Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3onPointSelectedTb4b4b4) Tb4b4b4{
Tff7b72object Tb4b4b4: T56d364CartesianMarkerVisibilityListener Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffonShownTb4b4b4(Te6edf3markerTb4b4b4: Te6edf3CartesianMarkerTb4b4b4, Te6edf3targetsTb4b4b4: Te6edf3ListTff7b72<Te6edf3CartesianMarkerTb4b4b4.Te6edf3TargetTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3targetsTb4b4b4.Te6edf3firstOrNullTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3onPointSelectedTff7b72?.Te6edf3invokeTb4b4b4(Tffa657itTb4b4b4.Te6edf3xTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffonUpdatedTb4b4b4(Te6edf3markerTb4b4b4: Te6edf3CartesianMarkerTb4b4b4, Te6edf3targetsTb4b4b4: Te6edf3ListTff7b72<Te6edf3CartesianMarkerTb4b4b4.Te6edf3TargetTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3targetsTb4b4b4.Te6edf3firstOrNullTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3onPointSelectedTff7b72?.Te6edf3invokeTb4b4b4(Tffa657itTb4b4b4.Te6edf3xTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3CartesianChartHostTb4b4b4(
Te6edf3chart Tff7b72=
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffSpreadOperatorTa5d6ff"Tb4b4b4)
Te6edf3rememberCartesianChartTb4b4b4(
Tff7b72*Te6edf3layersTb4b4b4.Te6edf3toTypedArrayTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3startAxis Tff7b72= Te6edf3startAxisTb4b4b4,
Te6edf3endAxis Tff7b72= Te6edf3endAxisTb4b4b4,
Te6edf3bottomAxis Tff7b72= Te6edf3bottomAxisTb4b4b4,
Te6edf3marker Tff7b72= Te6edf3markerTb4b4b4,
Te6edf3markerVisibilityListener Tff7b72= Te6edf3markerVisibilityListenerTb4b4b4,
Te6edf3persistentMarkers Tff7b72= Tb4b4b4{ Te6edf3_ Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3selectedX Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3marker Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3marker Te6edf3at Te6edf3selectedX Tff7b72else Tff7b72null Tb4b4b4}Tb4b4b4,
Te6edf3fadingEdges Tff7b72= Te6edf3rememberFadingEdgesTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3decorations Tff7b72= Te6edf3decorationsTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3modelProducer Tff7b72= Te6edf3modelProducerTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Te6edf3scrollState Tff7b72= Te6edf3vicoScrollStateTb4b4b4,
Te6edf3zoomState Tff7b72= Te6edf3rememberVicoZoomStateTb4b4b4(Te6edf3zoomEnabled Tff7b72= Tff7b72trueTb4b4b4, Te6edf3initialZoom Tff7b72= Te6edf3ZoomTb4b4b4.Te6edf3ContentTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Common scaffold for all metric chart composables. Provides:
* - A [Column] container with the supplied [modifier]
* - An empty-data guard (returns early when [isEmpty] is true)
* - A remembered [CartesianChartModelProducer] passed to [content]
* - A trailing [Legend] strip
*
* @param isEmpty Whether the chart data is empty — when true, nothing is rendered.
* @param legendData Legend items shown below the chart.
* @param key Optional key for the [CartesianChartModelProducer] (e.g. a selected channel). Pass a different value to
* recreate the producer.
* @param hiddenSet Indices of hidden legend items (toggleable legend).
* @param onToggle Callback when a legend item is toggled; when null, a read-only legend is rendered.
* @param content Builder lambda receiving the [CartesianChartModelProducer] and a standard `Modifier.weight(1f)`
* suitable for the chart area.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffMetricChartScaffoldTb4b4b4(
Te6edf3isEmptyTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3legendDataTb4b4b4: Te6edf3ListTff7b72<Te6edf3LegendDataTff7b72>Tb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3keyTb4b4b4: Tffa657Any? Tff7b72= Tffa657UnitTb4b4b4,
Te6edf3hiddenSetTb4b4b4: Te6edf3SetTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3emptySetTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onToggleTb4b4b4: Tb4b4b4(Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3contentTb4b4b4: Tf0883e@Composable Te6edf3ColumnScopeTb4b4b4.Tb4b4b4(Te6edf3CartesianChartModelProducerTb4b4b4, Te6edf3ModifierTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isEmptyTb4b4b4) Tff7b72returnTf0883e@Column
Tff7b72val Te6edf3modelProducer Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3keyTb4b4b4) Tb4b4b4{ Te6edf3CartesianChartModelProducerTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3chartModifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff0.Te6edf3dpTb4b4b4)
Te6edf3contentTb4b4b4(Te6edf3modelProducerTb4b4b4, Te6edf3chartModifierTb4b4b4)
Te6edf3LegendTb4b4b4(
Te6edf3legendData Tff7b72= Te6edf3legendDataTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3hiddenSet Tff7b72= Te6edf3hiddenSetTb4b4b4,
Te6edf3onToggle Tff7b72= Te6edf3onToggleTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* An adaptive layout for metric screens. Uses a split Row for wide screens (tablets/landscape) and a stacked Column for
* narrow screens (phones). When [isChartExpanded] is true, the card list is hidden and the chart fills the available
* space.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffAdaptiveMetricLayoutTb4b4b4(
Te6edf3chartPartTb4b4b4: Tf0883e@Composable Tb4b4b4(Te6edf3ModifierTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3listPartTb4b4b4: Tf0883e@Composable Tb4b4b4(Te6edf3ModifierTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3isChartExpandedTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3BoxWithConstraintsTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3isExpanded Tff7b72= Te6edf3maxWidth Tff7b72>Tff7b72= T79c0ff6T79c0ff0T79c0ff0.Te6edf3dp
Tff7b72if Tb4b4b4(Te6edf3isExpandedTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3chartPartTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4.Te6edf3fillMaxHeightTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3AnimatedVisibilityTb4b4b4(Te6edf3visible Tff7b72= Tff7b72!Te6edf3isChartExpandedTb4b4b4, Te6edf3enter Tff7b72= Te6edf3expandVerticallyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3exit Tff7b72= Te6edf3shrinkVerticallyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3listPartTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4.Te6edf3fillMaxHeightTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3chartPartTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3isChartExpandedTb4b4b4) Tb4b4b4{
Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3fillMaxHeightTb4b4b4(Te6edf3fraction Tff7b72= T79c0ff0.45fTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3AnimatedVisibilityTb4b4b4(Te6edf3visible Tff7b72= Tff7b72!Te6edf3isChartExpandedTb4b4b4, Te6edf3enter Tff7b72= Te6edf3expandVerticallyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3exit Tff7b72= Te6edf3shrinkVerticallyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3listPartTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* A high-level template for metric screens that handles the Scaffold, AppBar, adaptive layout, and chart-to-list
* synchronisation.
*
* @param extraActions Additional composable actions rendered in the app bar before the expand/collapse toggle (e.g. a
* cooldown traceroute button).
*/
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72fun Tff7b72<Te6edf3TTff7b72> Td2a8ffBaseMetricScreenTb4b4b4(
Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3telemetryTypeTb4b4b4: Te6edf3TelemetryType?Tb4b4b4,
Te6edf3titleResTb4b4b4: Te6edf3StringResourceTb4b4b4,
Te6edf3nodeNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3dataTb4b4b4: Te6edf3ListTff7b72<Te6edf3TTff7b72>Tb4b4b4,
Te6edf3timeProviderTb4b4b4: Tb4b4b4(Te6edf3TTb4b4b4) Tff7b72-Tff7b72> Tffa657DoubleTb4b4b4,
Te6edf3infoDataTb4b4b4: Te6edf3ListTff7b72<Te6edf3InfoDialogDataTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onRequestTelemetryTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3extraActionsTb4b4b4: Tf0883e@Composable Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3chartPartTb4b4b4: Tf0883e@Composable Tb4b4b4(Te6edf3ModifierTb4b4b4, Tffa657Double?Tb4b4b4, Te6edf3VicoScrollStateTb4b4b4, Tb4b4b4(Tffa657DoubleTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3listPartTb4b4b4: Tf0883e@Composable Tb4b4b4(Te6edf3ModifierTb4b4b4, Tffa657Double?Tb4b4b4, Te6edf3LazyListStateTb4b4b4, Tb4b4b4(Tffa657DoubleTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3controlPartTb4b4b4: Tf0883e@Composable Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3displayInfoDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3isChartExpanded Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}

Tff7b72val Te6edf3lazyListState Tff7b72= Te6edf3rememberLazyListStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3vicoScrollState Tff7b72=
Te6edf3rememberVicoScrollStateTb4b4b4(
Te6edf3autoScroll Tff7b72= Te6edf3ScrollTb4b4b4.Te6edf3AbsoluteTb4b4b4.Te6edf3EndTb4b4b4,
Te6edf3autoScrollCondition Tff7b72= Te6edf3AutoScrollConditionTb4b4b4.Te6edf3OnModelGrowthTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3coroutineScope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3selectedX Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Tffa657Double?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}

Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3nodeNameTb4b4b4,
Te6edf3subtitle Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3titleResTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff (Tffd700${Te6edf3dataTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff Tffd700${Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3logsTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4,
Te6edf3ourNode Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3showNodeChip Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{
Te6edf3extraActionsTb4b4b4(Tb4b4b4)
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3isChartExpanded Tff7b72= Tff7b72!Te6edf3isChartExpanded Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isChartExpandedTb4b4b4) Tb4b4b4{
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3List
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3BarChart
Tb4b4b4}Tb4b4b4,
Te6edf3contentDescription Tff7b72=
Te6edf3stringResourceTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3isChartExpandedTb4b4b4) Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3collapse_chart Tff7b72else Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3expand_chartTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3infoDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3displayInfoDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3InfoTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3infoTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3telemetryType Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3IconButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onRequestTelemetryTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3testTagTb4b4b4(Ta5d6ff"Ta5d6ffrefresh_buttonTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3RefreshTb4b4b4, Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3innerPadding Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3innerPaddingTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3displayInfoDialogTb4b4b4) Tb4b4b4{
Te6edf3LegendInfoDialogTb4b4b4(Te6edf3infoData Tff7b72= Te6edf3infoDataTb4b4b4, Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3displayInfoDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4)
Tb4b4b4}

Te6edf3controlPartTb4b4b4(Tb4b4b4)

Te6edf3AdaptiveMetricLayoutTb4b4b4(
Te6edf3isChartExpanded Tff7b72= Te6edf3isChartExpandedTb4b4b4,
Te6edf3chartPart Tff7b72= Tb4b4b4{ Te6edf3modifier Tff7b72-Tff7b72>
Te6edf3chartPartTb4b4b4(Te6edf3modifierTb4b4b4, Te6edf3selectedXTb4b4b4, Te6edf3vicoScrollStateTb4b4b4) Tb4b4b4{ Te6edf3x Tff7b72-Tff7b72>
Te6edf3selectedX Tff7b72= Te6edf3x
Tff7b72val Te6edf3index Tff7b72= Te6edf3dataTb4b4b4.Te6edf3indexOfFirst Tb4b4b4{ Te6edf3timeProviderTb4b4b4(Tffa657itTb4b4b4) Tff7b72=Tff7b72= Te6edf3x Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3index Tff7b72!Tff7b72= Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3coroutineScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3lazyListStateTb4b4b4.Te6edf3animateScrollToItemTb4b4b4(Te6edf3indexTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3listPart Tff7b72= Tb4b4b4{ Te6edf3modifier Tff7b72-Tff7b72>
Te6edf3listPartTb4b4b4(Te6edf3modifierTb4b4b4, Te6edf3selectedXTb4b4b4, Te6edf3lazyListStateTb4b4b4) Tb4b4b4{ Te6edf3x Tff7b72-Tff7b72>
Te6edf3selectedX Tff7b72= Te6edf3x
Te6edf3coroutineScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3vicoScrollStateTb4b4b4.Te6edf3animateScrollTb4b4b4(Te6edf3ScrollTb4b4b4.Te6edf3AbsoluteTb4b4b4.Te6edf3xTb4b4b4(Te6edf3xTb4b4b4, Te6edf3CommonChartsTb4b4b4.Te6edf3SCROLL_BIASTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.29s